/**
 *
 */
package br.gov.ms.tce.cjur.acao;

import java.io.Serializable;
import java.util.List;

import javax.faces.event.ActionEvent;
import javax.faces.event.AjaxBehaviorEvent;
import javax.inject.Inject;

import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.gov.ms.tce.bean.cjur.Solicitacao;
import br.gov.ms.tce.bean.comum.PessoaFisica;
import br.gov.ms.tce.bean.comum.TipoClassificacao;
import br.gov.ms.tce.bean.enumerator.ClassificacaoEnum;
import br.gov.ms.tce.cjur.helper.CjurHelper;
import br.gov.ms.tce.cjur.helper.CjurHelper.PeriodoFiltro;
import br.gov.ms.tce.cjur.service.PessoaService;
import br.gov.ms.tce.cjur.service.SolicitacaoService;
import br.gov.ms.tce.modelo.dao.MunicipioDAO;
import br.gov.ms.tce.modelo.dao.SolicitacaoDAO;
import br.gov.ms.tce.modelo.dao.TipoClassificacaoDAO;
import br.gov.ms.tce.modelo.dao.UfDAO;
import br.gov.ms.tce.modelo.dao.UnidadeAdministrativaDAO;
import br.gov.ms.tce.modelo.dao.UnidadeGestoraDAO;

/**
 * @author Anderson Paulino
 * @date 25/07/2011
 */
@Component("solicitacaoMB")
@Scope("session")
public class SolicitacaoMB implements Serializable{

	/**
	 * serialVersionUID:long
	 */
	private static final long serialVersionUID = -8371032627871308934L;
	
	@Inject private SolicitacaoService solicitacaoService;
	
	@Inject private PessoaService pessoaService;
	
	@Inject private UfDAO ufDAO;
	
	@Inject private MunicipioDAO municipioDAO;
	
	@Inject private UnidadeAdministrativaDAO uaDAO;
	
	@Inject private UnidadeGestoraDAO ugDAO;
	
	@Inject private TipoClassificacaoDAO tcDAO;
	
	@Inject private SolicitacaoDAO solicitacaoDAO;
	
	private SolicitacaoNovaAbstractView view;
	
	private StreamedContent fichaSolicitacao;
	
	private List<Solicitacao> solicitacoes;
	
	private TipoClassificacao situacaoFiltro;
	
	private PeriodoFiltro periodoFiltro;
	
	private Solicitacao solicitacao;
	
	private Integer solicitacaoCod;
	
	
	public SolicitacaoMB(){
		
	}
	
	public void changePesquisarPessoa(){
		view.setPesquisarPessoa(!view.getPesquisarPessoa());
	}
	
	public String getLoadSolicitacoes(){
		findByUsuarioAutenticadoAndPeriodoAndSituacao();
		return "";
	}
	
	public void findByUsuarioAutenticadoAndPeriodoAndSituacao(){
		this.solicitacoes = solicitacaoService.findByUsuarioAutenticadoAndPeriodoAndSituacao(periodoFiltro,situacaoFiltro );
	}
	
	public String novoResponsavel(){	
		view = new SolicitacaoNovoResponsavelView();
		view.setUfs(ufDAO.loadAll("descricao"));	
		view.setUas(uaDAO.loadAll("nome"));
		((SolicitacaoNovoResponsavelView)view).setTipoSexos(tcDAO.findByClassificacao(ClassificacaoEnum.TIPO_SEXO));		
		((SolicitacaoNovoResponsavelView)view).setTipoResponvels(tcDAO.findByClassificacao(ClassificacaoEnum.TIPO_RESPONSAVEL));		
		return "/externo/solicitacao_novo_responsavel.jsf";
	}
	
	public String novaUG(){
		view = new SolicitacaoNovaUGView();
		view.setUfs(ufDAO.loadAll("descricao"));	
		view.setUas(uaDAO.loadAll("nome"));
		((SolicitacaoNovaUGView)view).setTipoUgs(tcDAO.findByClassificacao(ClassificacaoEnum.TIPO_UNIDADE_GESTORA));
		return "/externo/solicitacao_nova_ug.jsf";
	}


	/**
	 * Seleciona a pessoa, e copia as propriedades para o objeto pessoaAlterada.
	 * @param actionEvent
	 */
	public void selecionarPessoa(ActionEvent actionEvent){
		view.copiarPropriedades();
		if(view.getEndereco().getUf()!=null)
			view.setMunicipios(municipioDAO.findByUf(view.getEndereco().getUf()));	
				
	}

	public void filtrarMunicipio(AjaxBehaviorEvent actionEvent){				
		view.setMunicipios(municipioDAO.findByUf(view.getEndereco().getUf()));
	}
	
	public void pesquisarSolicitacao(ActionEvent actionEvent){
		solicitacao = solicitacaoDAO.loadById(solicitacaoCod);
		solicitacaoCod=null;
	}
	
	public void pesquisarSolicitacao(Integer cod){
		solicitacao = solicitacaoDAO.loadById(cod);
	}
	
	public void filtrarUG(AjaxBehaviorEvent actionEvent){				
		view.setUgs(ugDAO.findByUA(view.getUa()));
	}
	
	public void finalizar(ActionEvent actionEvent){	
		solicitacao = solicitacaoService.salvar(view.getPessoaOriginal(), view.getPessoaAlterada());
	}
	
	public List<PessoaFisica> filtrarPessoaCPF(String subCpf){
		List<PessoaFisica> pessoas = pessoaService.findPessoaFisicaValiadoBySubCPF(subCpf);
		return pessoas;
	}
	

	public void addResponsavel(ActionEvent actionEvent){		
		((SolicitacaoNovoResponsavelView)view).addResponsavel();
	}
	
	public void mudarMostarPanelResp(ActionEvent actionEvent){
		((SolicitacaoNovoResponsavelView)view).mudarMostarPanelResp();
	}
	
	
	public String getNomePessoaAlterada(Solicitacao sol){
		return CjurHelper.getNomePessoaAlterada(sol);
	}
	
	public void gerarFichaSolicitacao(ActionEvent actionEvent){
		this.fichaSolicitacao = new DefaultStreamedContent(solicitacaoService.gerarFichaSolicitacao(solicitacao), "application/pdf", "ficha_solicitacao_"+solicitacao.getCod()+".pdf");
	}

	/**
	 * @return Retorna o valor da propriedade solicitacao
	 */
	public Solicitacao getSolicitacao() {
		return solicitacao;
	}


	/**
	 * @param Configura o valor da propriedade solicitacao
	 */
	public void setSolicitacao(Solicitacao solicitacao) {
		this.solicitacao = solicitacao;
	}	


	/**
	 * @return Retorna o valor da propriedade solicitacaoCod
	 */
	public Integer getSolicitacaoCod() {
		return solicitacaoCod;
	}


	/**
	 * @param Configura o valor da propriedade solicitacaoCod
	 */
	public void setSolicitacaoCod(Integer solicitacaoCod) {
		this.solicitacaoCod = solicitacaoCod;
	}


	/**
	 * @return Retorna o valor da propriedade fichaSolicitacao
	 */
	public StreamedContent getFichaSolicitacao() {
		return fichaSolicitacao;
	}


	/**
	 * @param Configura o valor da propriedade fichaSolicitacao
	 */
	public void setFichaSolicitacao(StreamedContent fichaSolicitacao) {
		this.fichaSolicitacao = fichaSolicitacao;
	}
	

	/**
	 * @return Retorna o valor da propriedade solicitacoes
	 */
	public List<Solicitacao> getSolicitacoes() {
		return solicitacoes;
	}

	/**
	 * @param Configura o valor da propriedade solicitacoes
	 */
	public void setSolicitacoes(List<Solicitacao> solicitacoes) {
		this.solicitacoes = solicitacoes;
	}

	/**
	 * @return Retorna o valor da propriedade periodoFiltro
	 */
	public PeriodoFiltro getPeriodoFiltro() {
		return periodoFiltro;
	}

	/**
	 * @param Configura o valor da propriedade periodoFiltro
	 */
	public void setPeriodoFiltro(PeriodoFiltro periodoFiltro) {
		this.periodoFiltro = periodoFiltro;
	}

	/**
	 * @return Retorna o valor da propriedade situacaoFiltro
	 */
	public TipoClassificacao getSituacaoFiltro() {
		return situacaoFiltro;
	}

	/**
	 * @param Configura o valor da propriedade situacaoFiltro
	 */
	public void setSituacaoFiltro(TipoClassificacao situacaoFiltro) {
		this.situacaoFiltro = situacaoFiltro;
	}

	/**
	 * @return Retorna o valor da propriedade view
	 */
	public SolicitacaoNovaAbstractView getView() {
		return view;
	}

	/**
	 * @param Configura o valor da propriedade view
	 */
	public void setView(SolicitacaoNovaAbstractView view) {
		this.view = view;
	}
	
	

	
	
	
}
